/*实用工具类：
    1.获取系统时间
    2.判断目标文件是否存在
    3.获取目标文件所在路径
    4.创建目录
*/

#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <ctime>
#include <sys/stat.h>

using namespace std;

namespace log{
    namespace util{
        class Date{
        public:
            static size_t getTime(){
                return time(nullptr);
            }
        };

        class File{
        public:
            //判断文件是否存在
            static bool exists(const string& path){
                // //检测文件是否能被访问，可以返回0，不行返回-1，Linux系统调用
                // return access(path.c_str(), F_OK) == 0;

                //跨平台用stat，获取文件属性信息，存在则成功获取返回0，不存在则获取失败返回-1
                struct stat st;
                if(stat(path.c_str(),&st)<0){
                    return false;
                }
                return true;
            }

            //获取文件所在目录
            static string path(const string& path){
                //  /home/Eclips3/study/LogSystem
                //实际上就是查找最后一个/的位置
                size_t pos = path.find_last_of("/\\");
                //如果一个/都没有，则证明在当前路径
                if(pos == string::npos){
                    return ".";
                }
                //substr[begin, end)
                //连/一起截取出来，pos+1
                return path.substr(0, pos + 1);
            }

            //创建目录
            static void createDirectory(const string& path){
                //  /home/Eclips3/study/LogSystem

                //如果目录为空或已存在则直接返回
                if(path.empty() || exists(path)){
                    return;
                }

                //pos：第一个/的位置，idx：查找的起始位置
                size_t pos = 0, idx = 0;

                while(idx < path.size()){
                    pos = path.find_first_of("/\\", idx);

                    //一开始是从0开始找，但此时/刚好在0，那么直接跳过该位置
                    if(pos == idx){
                        idx++;
                        continue;
                    }

                    //如果一个/都没有，则在当前路径创建
                    if(pos == string::npos){
                        //创建目录
                        mkdir(path.c_str(), 0777);
                        return;
                    }
                    else{
                        //获取父目录路径，要连/一起获取就+1
                        string pdir = path.substr(0, pos);

                        //如果父目录已存在，跳过
                        if(pdir == "." || pdir == ".." || exists(pdir) == true){
                            //从下一级目录开始查找
                            idx = pos + 1;
                            continue;
                        }

                        mkdir(pdir.c_str(), 0777);
                        idx = pos + 1;
                    }
                }

            }
        };
    }
}

#endif